/*
show_error(char *); - Функция вызова панельки с описанием ошибки. 

void send_move(char move[4]);	- функция пересылки хода. Пересылает исключительно цифры типа чар - массив.
Например если пришло сообщение вида 4365, это можно расшифровать как "D6-F4"
Иначе говоря здесь БукваЦифра. Буквы по нарастающей (1=А..8=H), Цифры наоборот (1=8..8=1)


!!!!!!!!!!!!!!!!NEED INCLUDE LOGIC.H
*/

#include <panel.h>
#include <ncurses.h>
#include <string.h>
#include <panel.h>
#include <network.h>
#include <checks.h>


void win_create_game();		// окошко создания игры
void game_interface();		// игровой интерфейс
void win_connect();			// окно со списком игр
void main_menu();			// главное меню
void win_waiting();			// окно ожидания
void print_cell(int k, int i, int j, char parm[4] );	// рисуем доску
void print_message(char msg[255], int who);					// для отправки сообщения
void win_help();				// помогирен
int show_error(char msg[128]);
int message(WINDOW * chat, char msg[256], int *i, int *pointer);
WINDOW *newwin(int nlines, int ncols, int begin_y, int begin_x);
WINDOW *derwin(WINDOW *orig, int nlines, int ncols, int begin_y, int begin_x);


/*
0 - пустая клетка
9 - выделенная пустая клетка 

1 - на клетке стоит белая шашка
2 - на клетке стоит белая дамка
3 - белая шашка выделена
4 - белая дамка выделена
 
-1 - на клетке стоит черная шашка
-2 - на клетке стоит черная дамка
-3 - черная шашка выделена
-4 - черная дамка выделена
*/
	char checkers[8][8];

WINDOW *debug, *log_border, *log;		// окошечко для тестирования
WINDOW *win_for_error, *win_for_error_border;		// окошечко для вывода ошибок
WINDOW *board;							// Поооле, русское пооОООооооле...
PANEL *panel_for_error;
PANEL  *top;




//=====================Окошечко=ожидания============================================
void win_waiting()
{
int key;
clear();
noecho();
attrset(COLOR_PAIR(1));
mvprintw(LINES/3, COLS/2-10, "Waiting..."); 
		attrset(A_STANDOUT);
		mvprintw(LINES-LINES/3, COLS/4,"Press Escape to exit to main menu");
refresh(); 
while((key=getch()) != '\n'){
	if (key==0x1B) 
		{
		clear();
		return;
		}
}
game_interface();	// загружаем интерфейс	
/*
//Получить время с точности до наносекунд
#include <time.h>
 
struct timespec now;
clock_gettime(CLOCK_REALTIME, &now);
printf("%d.%09li\n", now.tv_sec, now.tv_nsec);
*/

}
//////=================Окошечко=ожидания============================================

//=====================Панелька=для=отображения=ошибок==============================
/*
Пока сюда просто принимаем сообщение для вывода на экран.
Функцию вылета в главное меню надо будет мутить отдельно - в каждом случае свою
*/
int show_error(char msg[128])
{
wclear(win_for_error);
mvwprintw(win_for_error, 0, 10, "ACHTUNG!!!\n");


wprintw(win_for_error, msg);
wattron(win_for_error, A_STANDOUT);
mvwprintw(win_for_error, 4, 0, "Press ESC to exit in main menu");
wattroff(win_for_error, A_STANDOUT);

wrefresh(win_for_error);
wrefresh(win_for_error_border);
show_panel(panel_for_error);
update_panels();

while(getch() != 0x1B){}
hide_panel(panel_for_error);
update_panels();
return 0;		// а нуль ли тут возвращать будем?
}
//////=================Панелька=для=отображения=ошибок==============================


//=====================Окошечко=создания=игры=======================================
void win_create_game()
{
	int arr[3], i=0, key;	// i = 0(W)/1(B)/2(R)
	arr[0] = 2;				// тронешь - руки оторву. Lа я знаю что по феншую
	arr[1] = 1;				// надо так arr[4]={1}
	arr[2] = 1;				// но так не работает. Все просто обнуляется
	char name_game[32]={0};

	attrset(COLOR_PAIR(1));
	mvprintw(LINES-5, 1, "Window for debagging information:");         
	touchwin(debug);
	wrefresh(debug);
	
 
	mvprintw(1, COLS/2,"Create game");
	mvprintw(3, COLS/4,"Input name game: ");
	

	curs_set(TRUE);
	echo ();
do{

	refresh();
	attrset(COLOR_PAIR(1));
	if (scanw("%32s", name_game)==-1){
		attrset(COLOR_PAIR(3));
		mvprintw(3, COLS/4,"Warning - input name game: ");
	}
	else{
		clear();
		refresh();
		mvprintw(3, COLS/4,"Name game: %s", name_game);
		break;
	}
	
	
}while(1);

	noecho ();
	curs_set(FALSE);
	attrset(COLOR_PAIR(1));
	mvprintw(1, COLS/2,"Create game");
/*
	mvprintw(4, COLS/4,"Choose you dark side: ");
	attrset(COLOR_PAIR(2));
	mvprintw(5, COLS/4+2,"White");
	attrset(COLOR_PAIR(1));
	mvprintw(6, COLS/4+2,"Black");


	mvprintw(LINES-5, 1, "Window for debagging information:");         
	touchwin(debug);
	wrefresh(debug);  
    refresh();

	i=0;
	while((key=getch()) != '\n'){
		if (key== 0x1B) 
			{
			clear();
			return;
			}
		switch (key){
			case KEY_UP:		
				arr[i]=1;
				i--;
				if (i==0) i=2;
				arr[i]=2;
				break;
			
			case KEY_DOWN:
				arr[i]=1;
				i++;
				if (i==3) i=1;
				arr[i]=2;
				break;
			
			default:;
		}

		attrset(COLOR_PAIR(arr[0]));
		mvprintw(5, COLS/4+2,"White");
	
		attrset(COLOR_PAIR(arr[1]));
		mvprintw(6, COLS/4+2,"Black");

		refresh();
	}
	*/
	

	sending(sockfd, CREATEGAME, name_game);
	you=1;
	win_waiting();	
}

//=====================Присоединиться====================================


void win_connect()
{

	//----Да, здесь константы, но идесь нужны именно эти константы, так то
	WINDOW *game_list, *game_list_border ;
	attrset(COLOR_PAIR(1));
	mvprintw(1, COLS/3, "List of games");
	game_list_border = newwin(LINES-2, 35, 2, COLS/4);
	box(game_list_border, ACS_VLINE,ACS_HLINE);  
	wrefresh(game_list_border);
	game_list = derwin(game_list_border, LINES-4, 33, 1, 1);
	scrollok(game_list, TRUE);
	wrefresh(game_list);
	//--------------------------------------

	sending(sockfd, GAMELIST, NULL);

	int key;
	
	while(gameListStatus == 0){ // Ожидаем загрузку игр.
	}
	
	wattrset(game_list, COLOR_PAIR(1));
	int currentGame;
	for (currentGame = 0; currentGame < numbergames ; currentGame++){
		wprintw(game_list, "%s\n", gameaddr[currentGame].name);
	}
	wrefresh(game_list);	
	
	currentGame = 0;
	wattrset(game_list, COLOR_PAIR(2));
	mvwprintw(game_list, currentGame, 0, "%s", gameaddr[currentGame].name);
	wrefresh(game_list);
	while((key = getch()) != '\n'){
		if (key == 0x1B) {
			gameListStatus = numbergames = 0;
			delwin(game_list_border);
			delwin(game_list);
			clear();
			return;
		}
		switch (key){
			case KEY_UP:{
				wattrset(game_list, COLOR_PAIR(1));
				mvwprintw(game_list, currentGame, 0, "%s", gameaddr[currentGame].name);
				currentGame--;
				if(currentGame < 0){
					currentGame = numbergames - 1;
				}
				wattrset(game_list, COLOR_PAIR(2));
				mvwprintw(game_list, currentGame, 0, "%s", gameaddr[currentGame].name);
				break;
			}
			case KEY_DOWN:{
				wattrset(game_list, COLOR_PAIR(1));
				mvwprintw(game_list, currentGame, 0, "%s", gameaddr[currentGame].name);
				currentGame++;
				if(currentGame == numbergames){
					currentGame = 0;
				}
				wattrset(game_list, COLOR_PAIR(2));
				mvwprintw(game_list, currentGame, 0, "%s", gameaddr[currentGame].name);
				break;
			}				
		}
		wrefresh(game_list);
		refresh();
	}
	char gameid[10]; // Временное решение медленно перетекает в постоянный костыль
	sprintf(gameid, "%d", gameaddr[currentGame].id);
	sending(sockfd, JOINGAME, gameid);
	gameListStatus = numbergames = 0;
	delwin(game_list_border);
	delwin(game_list);
	clear();
	you=-1;
	game_interface();
}

////Присоединиться=======================================================


/*
ACS_HLINE='-'
ACS_ULCORNER='L'
ACS_URCORNER='-'
ACS_LLCORNER='-'
ACS_LRCORNER='¬'
ACS_VLINE='¦'
*/
void print_cell(int k, int i, int j, char parm[4] )
{
wattrset(board, COLOR_PAIR(k));
mvwprintw(board, 2*i, 4*j-3,parm);
mvwprintw(board, 2*i-1, 4*j-3,parm);
}

void print_message(char msg[255] , int who)
{

if ((who == you) && (who == 1)) wprintw(log, "Belosnejka: ");
else if ((who != you) && (you == 1)) wprintw(log, "Nigra: ");
else if ((who == you) && (who == -1)) wprintw(log, "Nigra: ");
else if ((who != you) && (you == -1)) wprintw(log, "Belosnejka: ");
refresh();
wprintw(log, msg);
wrefresh(log);
refresh();
}

int message(WINDOW * chat, char msg[256], int *i, int *pointer)
{
int exit=0, j, print_key;
int key;
wattrset(chat, COLOR_PAIR(1));

wrefresh(chat);

while(1){			// в строке 77 символов
	print_key=1;
	key=wgetch(chat);

	switch (key){
		case KEY_DOWN:
			key='1';
			break;
			
		case KEY_UP:
			key='2';
			break;

		case KEY_HOME:
			print_key=0;
			*pointer=*i;
			break;
			
		case KEY_END:
			print_key=0;
			*pointer=0;
			break;

		case KEY_LEFT:
				print_key=0;
				if (*i>*pointer)
					(*pointer)++;
				break;

		case KEY_RIGHT:
				print_key=0;
				if (*pointer>0)
					(*pointer)--;
			break;
		
		case '\n':	//enter
			if (*i==0) return 0;
			if (*i>229) *i=229;
			msg[*i]='\n';
			print_message(msg, you);
			sending(sockfd, CHAT, msg);
			
			for (j=0;j<*i+1;j++)
				msg[j]='\0';
			*i=*pointer=0;
			exit=1;
			refresh();
			break;

		case KEY_BACKSPACE:
				print_key=0;
				if ((*i<=229) && (*i>0)){
					for (j=0;j<*pointer;j++)
						msg[*i-*pointer+j-1]=msg[*i-*pointer+j];
					msg[*i]=msg[*i-1]='\0';
					(*i)--;	
				}	
			break;	
			
		
		case KEY_DC:		// Delete		//case 0x7F:
				print_key=0;
				if ( (*i<=229) && (*i>0) && (*pointer>0) ){
					for (j=0;j<*pointer;j++)
						msg[*i-*pointer+j]=msg[*i-*pointer+j+1];
					msg[*i]=msg[*i-1]='\0';
					(*i)--;	
					(*pointer)--;	
				}	
			break;

		
		case 0x1B:	// esc
			return 0x1B;
			break;
		
		case 0x09:	//tab
			return 0x09;
			break;

		default:;
	}	

	if (exit==1) break;

	if (print_key==1){

		if (*i<229)	{
			for (j=0;j<*pointer;j++)
				msg[*i-j]=msg[*i-1-j];
			msg[*i-*pointer]=key;
			(*i)++;	
		}	
		else wattrset(chat, COLOR_PAIR(3));
	}
	
	wclear(chat);
	wprintw(chat, msg);

	wmove(chat, (*i-*pointer)/(COLS-3), (*i-*pointer)%(COLS-3));	

	wrefresh(chat);

}

wclear(chat);
return 0;
}



void give_me_move(int stat, int x, int y)
{
							switch(stat)	{
								case -2: 
									checkers[x-1][y-1]=-2;
									print_cell(11, x, y, " DD ");
									break;
								case -1: 
									checkers[x-1][y-1]=-1;
									print_cell(11, x, y, " 00 ");
									break;
								case 0:
									checkers[x-1][y-1]=0;
									print_cell(11, x, y, "    ");
									break;
								case 1: 
									checkers[x-1][y-1]=1;
									print_cell(10, x, y, " 00 ");
									break;
								case 2: 
									checkers[x-1][y-1]=2;
									print_cell(10, x, y, " DD ");
									break;
								default:break;		
							}
}

void give_me_move_main(int move[9])
{
		if (move[8]==9)
			{
			if (move[5]==you)
				show_error ("YOU BiG NEWB!! AHAHAHAHA!!! L00000000000000000L");
			else show_error ("You GREATE POWER!!!!!!111111oneoneone");
			}
			
		give_me_move(move[6], move[1], move[0]);	// Р° С‚СѓС‚ РїСЂРёРЅРёРјР°РµРј
		give_me_move(move[7], move[3], move[2]);
		if ( (move[5] && move[4]) !=0)
			give_me_move(move[8], move[5], move[4]);



		wrefresh(board);

		refresh();

}

//=============================Игровой=интерфейс===========================
void game_interface()
{

	char msg[256]={0};
	int key, i, j, n, move[9];
	move[4]=move[5]=0;
	//int you=0;	//0 white, 1-black	- это значение принять от Вовы
	
WINDOW *chat_border, *chat;	
 
	clear();
	refresh();
	
	board = newwin(18, 34, 1, 1);					// доска (оформление)
	log_border = newwin(18, 0, 1, 36);				// для границ чата чата
	log = derwin(log_border, 16, COLS-38, 1, 1);	// для чата (сделано так чтобы границы не уничтожались)
	chat_border = newwin(5, 0, 19, 1);				// для границы окна сообщений
	chat = derwin(chat_border, 3, COLS-3, 1, 1);	// для написания сообщения
	
	wbkgd(board, COLOR_PAIR(1));
	attrset(COLOR_PAIR(1));
	mvprintw(0, 1,"   A   B   C   D   E   F   G   H");
	for (i=1;i<=8;i++)
		mvprintw(2*i, 0,"%d",9-i);
	mvprintw(0, COLS-COLS/3,"History");
	keypad (chat, TRUE);


	for (i = 0; i < 8; i++){
		for(j = 0; j < 8; j++){
			if (i<=2){
				if ( (i+j)%2==0 ) checkers[i][j] = 0;
				else checkers[i][j] = 1; 
			}
			else 
				if (i>=5){
					if ( (i+j)%2==0 ) checkers[i][j] = 0;
					else checkers[i][j] = -1;
				}
				else checkers[i][j] = 0;
		}
	}

	for (j=1;j<9;j++){
		for (i=1;i<9;i++){
			switch (checkers[i-1][j-1]){
				case 0:		
					if ((i+j)%2==0)
						print_cell(4, i, j, " 00 ");
					if ((i+j)%2==1)
						print_cell(5, i, j, " 00 ");
					break;
					
				case 1:		
					print_cell(10, i, j, " 00 ");
					break;
				case -1:	
					print_cell(11, i, j, " 00 ");
					break;
					
				case 3:		
					print_cell(12, i, j, " 00 ");
					break;
				case -3:	
					print_cell(13, i, j, " 00 ");
					break;				
	    	}
		}
	}

	wrefresh(board);
	wrefresh(log);
	wrefresh(chat);

	wattrset(board, COLOR_PAIR(0));
    box(board, ACS_VLINE,ACS_HLINE);  
    touchwin(board);
    wrefresh(board);
       
    
    box(log_border, ACS_VLINE,ACS_HLINE);  
    wbkgd(log_border, COLOR_PAIR(1));      
    touchwin(log_border);
    wrefresh(log_border);   
         
    box(chat_border, ACS_VLINE,ACS_HLINE);  
    wbkgd(chat_border, COLOR_PAIR(1));        
    touchwin(chat_border);
    wrefresh(chat_border);  
	
	noecho ();
    refresh();

	curs_set(FALSE); 					
	scrollok(log, TRUE);
	scrollok(chat, TRUE);
	i=1; j=1;
	print_cell(6, i, j, " 00 ");
	wrefresh(board);


char step[2][2];	// координаты хода. XN-XN. 
int words=0, pointer=0, color;
	step[0][0]=0;		// лень через фор
	step[0][1]=0;
	step[1][0]=0;
	step[1][1]=0;
	n=0;

    while(1){		// Esc=выход	
			if (key!=0x1B)		//|| (key !=0x09))
				key=getch();
			
			if (key==0x1B) break;

			switch (checkers[i-1][j-1]){
				case 0:		
					if ((i+j)%2==0)
						print_cell(4, i, j, " 00 ");
					if ((i+j)%2==1)
						print_cell(5, i, j, " 00 ");
					break;
				case 9:
						print_cell(7, i, j, " 00 ");
					break;						
				case 1:		
						print_cell(10, i, j, " 00 ");
					break;
				case -1:	
						print_cell(11, i, j, " 00 ");
					break;
				case 2:		
						print_cell(10, i, j, " DD ");
					break;
				case -2:	
						print_cell(11, i, j, " DD ");
					break;
				case 3:		
						print_cell(12, i, j, " 00 ");
					break;
				case -3:	
						print_cell(13, i, j, " 00 ");
					break;	
				case 4:		
						print_cell(12, i, j, " DD ");
					break;
				case -4:
						print_cell(13, i, j, " DD ");
					break;				
	    	}

    	switch(key)
    		{
    		case KEY_UP:
				i--;
				if (i<1) i=8;
  			
    			break;
    			
    		case KEY_DOWN:
    			i++;
    			if (i>8) i=1;
				
    			break;
    			
    		case KEY_LEFT:
				j--;
				if (j<1) j=8;	
							
    			break;
    			
    		case KEY_RIGHT:
				j++;
				if (j>8) j=1;
								
    			break;

    		case 0x09:		// TAB
					curs_set(TRUE); 

					switch (checkers[i-1][j-1]){
						case 0:		
							if ((i+j)%2==0)
								print_cell(4, i, j, " 00 ");
							if ((i+j)%2==1)
								print_cell(5, i, j, " 00 ");
							break;
						case 1:		
							print_cell(10, i, j, " 00 ");
							break;
						case -1:	
							print_cell(11, i, j, " 00 ");
							break;
						case 2:		
							print_cell(10, i, j, " DD ");
							break;
						case -2:	
							print_cell(11, i, j, " DD ");
							break;
					}

					wrefresh(board);
					key=message(chat, msg, &words, &pointer);
	
					curs_set(FALSE); 
    			break;
    			
    		case ' ':		// space
    			if ((i+j)%2==1)
    				{
					if (step[0][0]==0)		// выбираем клетку начала хода
						{
						step[0][0]=j;
						step[0][1]=i;
						if (checkers[i-1][j-1]==1) checkers[i-1][j-1]=3;
						if (checkers[i-1][j-1]==-1) checkers[i-1][j-1]=-3;
						if (checkers[i-1][j-1]==2) checkers[i-1][j-1]=4;
						if (checkers[i-1][j-1]==-2) checkers[i-1][j-1]=-4;
						if (checkers[i-1][j-1]==0) checkers[i-1][j-1]=9;
						n++;
						}
					else					// отменяем выбор клетки начала хода
						{
						if ((i==step[0][1]) && (j==step[0][0]))
							{
							step[0][0]=0;
							step[0][1]=0;
							if (checkers[i-1][j-1]==3) checkers[i-1][j-1]=1;
							if (checkers[i-1][j-1]==-3) checkers[i-1][j-1]=-1;
							if (checkers[i-1][j-1]==4) checkers[i-1][j-1]=2;
							if (checkers[i-1][j-1]==-4) checkers[i-1][j-1]=-2;
							if (checkers[i-1][j-1]==9) checkers[i-1][j-1]=0;
							n--;	
							}
						else
							{
							step[1][0]=j;
							step[1][1]=i;
							
							n=0;	//ход сделан
							move[0]=step[0][0];	
							move[1]=step[0][1];
							move[2]=step[1][0];
							move[3]=step[1][1];

							switch (checkers[step[0][1]-1][step[0][0]-1]){

								case 3:
									checkers[step[0][1]-1][step[0][0]-1] = 1;
									print_cell(10, step[0][1], step[0][0], " 00 ");
									break;
								case -3:
									checkers[step[0][1]-1][step[0][0]-1] = -1;
									print_cell(11, step[0][1], step[0][0], " 00 ");
									break;
								case 4:
									checkers[step[0][1]-1][step[0][0]-1] = 2;
									print_cell(12, step[0][1], step[0][0], " DD ");
									break;
								case -4:
									checkers[step[0][1]-1][step[0][0]-1] = -2;
									print_cell(13, step[0][1], step[0][0], " DD ");
									break;
								case 9:
									checkers[step[0][1]-1][step[0][0]-1] = 0;
									if ((i+j)%2==0)
										print_cell(4, step[0][1], step[0][0], " 00 ");
									if ((i+j)%2==1)
										print_cell(5, step[0][1], step[0][0], " 00 ");
									
									break;
							}
							wrefresh(board);

	//---1111---
char lol[9];
sprintf(lol, "%d%d%d%d%d%d%d%d%d", move[0],move[1],move[2],move[3],move[4],move[5],move[6],move[7],move[8]);
//mvprintw(20, 1, "%s", lol);
sending(sockfd, MOVE, lol);



							//send_move(move, checkers);	// вот тут мы передаем ход

							give_me_move_main(move);




	
														
							step[0][1]=step[0][0]=step[1][1]=step[1][0]=0;	
							}
						}
	    			} 	
	    			default:;
				break;		

    		}
			
			switch (checkers[i-1][j-1]){
				case 0:		
						print_cell(6, i, j, " 00 ");
					break;
				case 9:
						print_cell(7, i, j, " 00 ");
					break;			
				case 1:		
						print_cell(14, i, j, " 00 ");
					break;
				case -1:	
						print_cell(15, i, j, " 00 ");
					break;
				case 2:		
						print_cell(14, i, j, " DD ");
					break;
				case -2:	
						print_cell(15, i, j, " DD ");
					break;
				case 3:		
						print_cell(12, i, j, " 00 ");
					break;
				case -3:
						print_cell(13, i, j, " 00 ");
					break;	
				case 4:		
						print_cell(12, i, j, " DD ");
					break;
				case -4:
						print_cell(13, i, j, " DD ");
					break;			
	    	}

				wrefresh(board);
				wrefresh(log_border); 
				wrefresh(log);
				wrefresh(chat_border); 
				wrefresh(chat);

				refresh();
			
			}
			delwin(board); 
			delwin(log_border);
			delwin(log); 
			delwin(chat_border); 
			delwin(chat);
clear();
refresh();
}

/*
//	ЗДЕСЬ ТЕБЕ НАДО ЗАБРАТЬ СЛЕДУЮЩЕЕ!!!
ЧАТ:
char msg[256]	- чатное сообщение
	- координаты начала
	- координаты конца
	
ПОЛЕ:
Функция: send_move(char move[4])
Цифра-Буква. Первые два байта координата начала, вторые два байта - координата конца

*/
	
////Игровой=интерфейс======================================================

void win_help()
{
// этот кусок кода написан на "отвали" 
		attrset(COLOR_PAIR(1));
		mvprintw(1, COLS/2-10,"Help");
		
		attrset(COLOR_PAIR(2));
		mvprintw(3, 1,"Developer Interface: ");
		attrset(COLOR_PAIR(1));
		printw("OMFG U THINK i HAVE TIME TO HELP SOME STUPID NEWBS. RTFM.");

		attrset(COLOR_PAIR(2));
		mvprintw(4, 1,"Main Programmer: ");
		attrset(COLOR_PAIR(1));
		printw("LOL UR TOTAL N00b. RTFM u f4g. go kill ur self.");
	
		attrset(COLOR_PAIR(2));
		mvprintw(5, 1,"Tester: ");
		attrset(COLOR_PAIR(1));
		printw("RTFM newb. come back when u haw3 sum skillz.");

		attrset(COLOR_PAIR(2));
		mvprintw(6, 1,"Team developers: ");
		attrset(COLOR_PAIR(1));
		printw("Go Uze ");
		attrset(COLOR_PAIR(3));
		printw("\"noughts and crosses\"");
		attrset(COLOR_PAIR(1));
		printw(" or sumthing ROFLOLOOLOLL!!1!1111oneeleven1one!");

		attrset(A_STANDOUT);
		mvprintw(LINES-LINES/3, COLS/4,"Press Escape to exit to main menu");
	while(getch() != 0x1B){}
	clear();
}



//=====================Главное=меню=======================================
void main_menu()
{
	int arr[4], i=0, key, exit_prog=0;
	arr[0] = 2;				// тронешь - руки оторву
	arr[1] = 1;				// да я знаю что по феншую
	arr[2] = 1;				// надо так arr[4]={1}
	arr[3] = 1;				// но так не работает. Все просто обнуляется

	initscr();
	
	keypad(stdscr, TRUE);
	start_color();
	refresh();
	init_pair(1, COLOR_WHITE, 0);	// Активная строка
	init_pair(2, COLOR_GREEN, 0);	// Активная строка
	init_pair(3, COLOR_RED, 0 );	// Предупреждение
	
	init_pair(4, COLOR_WHITE, COLOR_WHITE );	// для белых клеток
	init_pair(5, COLOR_MAGENTA, COLOR_MAGENTA);		// для черных клеток
	init_pair(6, COLOR_CYAN, COLOR_CYAN);	// курсор
	init_pair(7, COLOR_BLUE, COLOR_BLUE);	// выделили
	
	init_pair(8, COLOR_BLACK, COLOR_BLACK);	// для фона
	init_pair(9, COLOR_BLACK, COLOR_WHITE);	// для окошек

	init_pair(10, COLOR_WHITE, COLOR_MAGENTA);	// на этой клетке стоит белая шашка
	init_pair(11, COLOR_BLACK, COLOR_MAGENTA);	// черная шашка

	init_pair(12, COLOR_WHITE, COLOR_BLUE);	// выбрана клетка содержащая белую шашку
	init_pair(13, COLOR_BLACK, COLOR_BLUE);	// ...черную шашку

	init_pair(14, COLOR_WHITE, COLOR_CYAN);	// выделена клетка содержащая белую шашку
	init_pair(15, COLOR_BLACK, COLOR_CYAN);	// ...черную шашку	
/*
COLOR_BLACK
COLOR_RED
COLOR_GREEN
COLOR_YELLOW
COLOR_BLUE
COLOR_MAGENTA
COLOR_CYAN
COLOR_WHITE
*/
	
    mvprintw(LINES-5, 1, "Window for debagging information:");
	debug = newwin(3, 0, LINES-4, 0);        // для отладки


	win_for_error_border = newwin (7, 34, LINES/2-5, COLS/2-10);
	win_for_error = derwin(win_for_error_border, 5, 32, 1, 1);
	wbkgdset(win_for_error_border, COLOR_PAIR(12));
	wbkgdset(win_for_error, COLOR_PAIR(12));
	box(win_for_error_border, ACS_VLINE,ACS_HLINE); 

	panel_for_error = new_panel(win_for_error_border);

	
	
    box(debug, ACS_VLINE,ACS_HLINE);         
    touchwin(debug);
    wrefresh(debug);   
    
    refresh();
	noecho ();// чтобы буква в getch() "не печаталась"
	
	curs_set(FALSE);
	mvprintw(1, COLS/2,"Checkers");

	attrset(COLOR_PAIR(2));
	mvprintw(3, COLS/2,"Create new game");
	
	attrset(COLOR_PAIR(1));
	mvprintw(4, COLS/2,"Join");
	
	attrset(COLOR_PAIR(1));
	mvprintw(5, COLS/2,"Help");
	
	attrset(COLOR_PAIR(1));
	mvprintw(6, COLS/2,"Exit");

	refresh();
while(1){
	while((key=getch()) != '\n'){
		if (key== 0x1B) 	// Esc
			{
			i = 3;
			exit_prog=1;
			break;
			}
		switch (key)			
			{
			case KEY_UP:		
				arr[i]=1;
				i--;
				if (i==-1) i=3;
				arr[i]=2;
				break;
			
			case KEY_DOWN:
				arr[i]=1;
				i++;
				if (i==4) i=0;
				arr[i]=2;
				break;
			
			default:;
			}
		attrset(COLOR_PAIR(1));
		mvprintw(1, COLS/2,"Checkers");

		attrset(COLOR_PAIR(arr[0]));
		mvprintw(3, COLS/2,"Create new game");
	
		attrset(COLOR_PAIR(arr[1]));
		mvprintw(4, COLS/2,"Join");
	
		attrset(COLOR_PAIR(arr[2]));
		mvprintw(5, COLS/2,"Help");
		
		attrset(COLOR_PAIR(arr[3]));
		mvprintw(6, COLS/2,"Exit");

		refresh();
	}

	clear();
	refresh();
	//echo ();	// вновь позволяем вводить буковки
			
		switch (i)			
			{
			case 0:		
				win_create_game();	// переход на функцию "Создать"
				break;
			
			case 1:		
				win_connect();		// переход на функцию "Присоединиться"
				break;

			case 2:		
				win_help();	// переход на функцию "Помощь"
				break;
			case 3:				//exit
				exit_prog=1;
				break;

			default:;
			}

		attrset(COLOR_PAIR(1));
		mvprintw(1, COLS/2,"Checkers");

		attrset(COLOR_PAIR(arr[0]));
		mvprintw(3, COLS/2,"Create new game");
	
		attrset(COLOR_PAIR(arr[1]));
		mvprintw(4, COLS/2,"Join");
	
		attrset(COLOR_PAIR(arr[2]));
		mvprintw(5, COLS/2,"Help");
	
		attrset(COLOR_PAIR(arr[3]));
		mvprintw(6, COLS/2,"Exit");
		
	refresh();
	if (exit_prog==1) break;
}
//while((key=getch()) != 0x1B){}
	del_panel(panel_for_error);
	delwin(win_for_error);
	delwin(debug);
	
    endwin();  
}
